/**
* @file    hi_uartmsg.h
* @brief   uart message struct and interface declaration
*
* Copyright (C), 2016-2019, Hisilicon Tech. Co., Ltd.
*
* @author    IP Camera Reference Develop Team
* @date       2018/12/11
* @version   1.0

*/


#ifndef __HI_UARTMSG_H__
#define __HI_UARTMSG_H__

#include "pm/hi_type.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */


#pragma  pack (push,1)                //1字节对齐


#define HI_UARTMSG_CMD_DATA_MAX_LEN     (128)

#define KEYCODE_1            (1)
#define KEYCODE_RESET        (2)



//唤醒类型值与唤醒优先级保持一致.
typedef enum
{
    HI_UARTMSG_POWER_PIR,               //PIR唤醒
    HI_UARTMSG_POWER_REMOTE,            //远程唤醒(WiFi)
    HI_UARTMSG_POWER_KEY,               //按键上电(门铃)
    HI_UARTMSG_POWER_USB_INSERT,        //USB接入上电
    HI_UARTMSG_POWER_RTC_WAKEUP,        //定时唤醒

    HI_UARTMSG_POWER_LOW_ELECTRY,       //低电上电
    HI_UARTMSG_POWER_BACK_DEFAULT,      //恢复默认上电
    HI_UARTMSG_POWER_LONGALIVE,         //常电上电
    HI_UARTMSG_POWER_NORMAL,            //开机上电
    
    HI_UARTMSG_POWER_WARNING,           //防撬报警唤醒
    HI_UARTMSG_POWER_NETCFG,            //配网按键唤醒

    HI_UARTMSG_POWER_RTC_ALARM,			//RTC闹钟唤醒

    HI_UARTMSG_POWER_BUTT
} HI_UARTMSG_SOCPOWER_TYPE_E;


typedef enum
{
    HI_UARTMSG_KEY_DOWN          = 0,
    HI_UARTMSG_KEY_UP            = 1,
    HI_UARTMSG_KEY_REPEAT        = 2,
    HI_UARTMSG_KEY_EVENT_BUTT
} HI_UARTMSG_KEY_EVENT_E;


typedef enum hiUARTMSG_MSGID
{
    HI_UARTMSG_M2S_FACTORYSET                  = 0x00,    //请求SOC恢复出厂设置，给自己复位.
    HI_UARTMSG_M2S_LOW_BATTERY_ALARM           = 0x01,    //低电告警  (1Byte电池电量  )
    HI_UARTMSG_M2S_PIR_ALARM                   = 0x02,    //PIR告警.
    HI_UARTMSG_M2S_WIFI_ALARM                  = 0x03,    //Wifi激活事件
    HI_UARTMSG_M2S_EXTERNALPOWERIN             = 0x04,    //外部电源接入消息
	HI_UARTMSG_M2S_EXTERNALPOWEROUT            = 0x05,    //外部电源拔出消息
    HI_UARTMSG_M2S_KEYEVENT                    = 0x06,    //按键  (1Byte键值+1Byte按下抬起重复+1Byte长按标志)
	HI_UARTMSG_M2S_DEBUG_REPORTINFO            = 0x07,    //MCU调试信息
	HI_UARTMSG_M2S_GET_POWER_ON_TYPE_ACK       = 0x20,    //获取上电类型ACK (1Byte上电类型   + 1Byte电池电量     + 1bit外部电源 指示 + 1bit电池指示 + 1bit充电指示  +5bit保留)
	HI_UARTMSG_M2S_GET_POWERINFO_ACK           = 0x21,    //获取电源信息ACK (1Byte电池电量   + 1bit外部电源 指示 + 1bit电池指示 + 1bit充电指示  +5bit保留)
	HI_UARTMSG_M2S_GET_DATETIME_ACK            = 0x22,    //获取RCT时间ACk ()
	HI_UARTMSG_M2S_GET_WIFI_STATUS_ACK         = 0x23,    //获取WiFi状态ACK (1Byte Wifistatu)
	HI_UARTMSG_M2S_GET_PIR_SENSITIVITY_ACK     = 0x24,    //PIR灵敏度 ACK
	HI_UARTMSG_M2S_WDG_TIME_CFG_ACK			   = 0x25,	  //配置看门狗喂狗时间 ACK	(1byte 0x01)
	HI_UARTMSG_M2S_WDG_STATE_CFG_ACK		   = 0x26,	  //配置看门狗工作状态 ACK (1byte 0x00:disable,0x01:enable)
	HI_UARTMSG_M2S_WDG_FEED_ACK				   = 0x27,	  //喂狗 ACK (1byte 0x01)
    HI_UARTMSG_M2S_GET_MCU_VERSION_ACK         = 0x28,    //SOC获取MCU版本号ACK
    HI_UARTMSG_M2S_GET_RTC_ALARM_ACK           = 0x29,    //SOC获取MCU闹钟时间及状态ACK
    HI_UARTMSG_M2S_GET_DEFAULT_DATA_ACK        = 0x2A,    //SOC获取系统默认参数ACK
	HI_UARTMSG_M2S_GET_PIR_DELAY_TIME_ACK	   = 0x2B,	  //SOC获取PIR延时唤醒参数（3字节：byte0:延时总时长(秒)，byte1:延时期间触发时长(秒)，byte2:pir告警最小时间间隔(秒)）
	HI_UARTMSG_M2S_SOC_POWER_DOWN_ACK  		   = 0x2C,	  //SOC下电正常回复（1字节,byte0:0表示异常1表示正常）
    HI_UARTMSG_M2S_GET_TEMPERATURE_ACK         = 0x2D,    //透传测温模块上传的数据   
	
	HI_UARTMSG_M2S_GET_ACK                     = 0x2F,    //MCU回应消息的最大ACK
    HI_UARTMSG_M2S_RESERV                      = 0x40,    //保留
    HI_UARTMSG_M2S_BUTT                        = 0x7f,

    HI_UARTMSG_S2M_SOC_POWER_DOWN              = 0x80,    //SOC下电.
	HI_UARTMSG_S2M_MCU_RSET                    = 0x81,    //MCU复位
	HI_UARTMSG_S2M_CLR_MCU_WAKE_FLAG           = 0x82,    //清除WiFi唤醒标识
	HI_UARTMSG_S2M_CLR_WAKE_UP_EVENT           = 0x83,    //清除唤醒事件
    HI_UARTMSG_S2M_SET_WIFI_RST                = 0x90,    //设置WiFi复位管脚 (1Byte复位管脚的值)
    HI_UARTMSG_S2M_SET_WIFI_POWER              = 0x91,    //设置WiFi电源管脚(1Byte上电管脚的值)
	HI_UARTMSG_S2M_SET_WIFI_STATUS             = 0x92,    //设置WiFi状态 + U8
    HI_UARTMSG_S2M_SET_PIR_SWITCH              = 0x93,    //设置PIR开关+ (U8)
    HI_UARTMSG_S2M_SET_PIR_SENSITIVITY         = 0x94,    //设置PIR敏感度+ (U8)
    HI_UARTMSG_S2M_SET_DATETIME                = 0x95,    //设置RTC时间
	HI_UARTMSG_S2M_SET_TIMER_WAKEUP            = 0x96,    //设置定时唤醒时间(格式，3字节：byte0:alarm_min,byte1:alarm_hour,byte2:alarm_switch,)
	HI_UARTMSG_S2M_SET_DEFAULT_DATA            = 0x97,    //设置系统默认参数
	HI_UARTMSG_S2M_SET_LED_DATA                = 0x98,    //设置LED数据
    HI_UARTMSG_S2M_SET_PIR_DELAY_TIME          = 0x99,    //设置PIR延时唤醒参数（3字节：byte0:延时总时长(秒)，byte1:延时期间触发时长(秒)，byte2:pir告警最小时间间隔(秒)）	

    HI_UARTMSG_S2M_GET_POWER_ON_TYPE           = 0xA0,    //获取上电类型.
    HI_UARTMSG_S2M_GET_POWERINFO               = 0xA1,    //获取电源信息
	HI_UARTMSG_S2M_GET_WIFI_STATUS             = 0xA2,    //获取WiFi状态
	HI_UARTMSG_S2M_GET_PIR_SENSITIVITY         = 0xA4,    //PIR获取PIR灵敏度
	HI_UARTMSG_S2M_GET_DATETIME                = 0xA5,    //获取RCT时间
	HI_UARTMSG_S2M_WDG_TIME_CFG				   = 0xA6,	  //配置看门狗喂狗时间(uint32_t ms)
	HI_UARTMSG_S2M_WDG_STATE_CFG			   = 0xA7,	  //配置看门狗工作状态(1byte 0x00:disable,0x01:enable)
	HI_UARTMSG_S2M_WDG_FEED					   = 0xA8,	  //喂狗	
    HI_UARTMSG_S2M_GET_MCU_VERSION             = 0xA9,    //SOC获取MCU版本号
    HI_UARTMSG_S2M_GET_RTC_ALARM               = 0xAA,    //SOC获取MCU闹钟时间及状态(格式，3字节：byte0:alarm_min,byte1:alarm_hour,byte2:alarm_switch,)
    HI_UARTMSG_S2M_GET_DEFAULT_DATA            = 0xAB,    //SOC获取系统默认参数

	HI_UARTMSG_S2M_GET_PIR_DELAY_TIME          = 0xAC,    //获取PIR延时唤醒参数
	HI_UARTMSG_S2M_SOC_POWER_DOWN_WAIT_ACK	   = 0xAD,    //SOC下电，需要等待MCU回复，不下电也不回复则重复发3次，再不回复则SOC主动reset MCU。
    HI_UARTMSG_S2M_GET_TEMPERATURE             = 0xAE,    //透传下发到测温模块的命令

	HI_UARTMSG_S2M_APP_RESERV                  = 0xD0,    //app保留
    HI_UARTMSG_S2M_DEBUG_SET_VOLT              = 0xD1,    //
    HI_UARTMSG_S2M_DEBUG_MCU_DEATH             = 0xD2,    //
    HI_UARTMSG_S2M_DEBUG_POWER_IN              = 0xD3,    //
    HI_UARTMSG_S2M_DEBUG_LOWPOWER              = 0xD4,    //
    HI_UARTMSG_S2M_DEBUG_BUTT                  = 0xFF
} HI_UARTMSG_MSGID_E;

#define HI_UARTMSG_BASE_YEAR (2000)

typedef struct
{
    HI_U8 year; /*2000 as base year,  19 means 2019*/
    HI_U8 month;
    HI_U8 day;
    HI_U8 hour;
    HI_U8 minute;
    HI_U8 second;
} HI_DateTime;

typedef struct
{
    HI_U8 keyvalue;                   //键值.
    HI_U8 event;                      //按键事件 :  0、Down，1、Up. 2、repeat
    HI_U8 islong;                     //是否为长按，0、短按，1、长按.
} HI_KeyEvent;

typedef struct
{
    HI_U8 socStartMaxSecond;       //SOC 启动超时时间 单位s
    HI_U8 pirAlarmSwith;           //PIR 告警开关
    HI_U8 pirAlarmInterval;        //PIR 告警间隔.
    HI_U8 pirSensibility;          //PIR 灵敏度.
    HI_U8 batteryLevel1Cfg;        //电池电量1.  20
    HI_U8 batteryLevel2Cfg;        //电池电量2.  12
    HI_U8 batteryLevel3Cfg;        //电池电量3.  10
    HI_U8 keyResetTimeSeconds;     //长按时间阈值S
    HI_U8 stopchecksocalive;	   //是否停止检测SOC活跃状态，用在调试或升级时
    HI_U8 longAlive;               //是否常电模式
} HI_UARTMSG_DEFAULT_DATA;

typedef struct
{
    HI_U16 u16RecCmd80Cnt;
    HI_U16 u16RecCmd82Cnt;
    HI_U16 u16RecCmd84Cnt;
    HI_U16 u16RecCmd88Cnt;
    HI_U16 u16RecCmd8ACnt;
    HI_U16 u16RecCmd8CCnt;
    HI_U16 u16RecCmdErrCnt;
    HI_U16 u16KeyCnt;
    HI_U16 u16PirCnt;
    HI_U16 u16WifiCnt;
    HI_U16 u16MCUVer;
} HI_UARTMSG_DEBUGINFO;

typedef struct
{
    HI_UARTMSG_MSGID_E    u32MsgId;                       //事件消息ID号
    HI_U8                data[HI_UARTMSG_CMD_DATA_MAX_LEN];
    HI_U8                dataLen;
} HI_UARTMSG_PARM_S;


#pragma pack(pop)


typedef HI_VOID (*PFN_HI_UARTMSG_RECV_CBK)(HI_UARTMSG_PARM_S* pRcvMsg);


/*********************************************************************
    Function:     HI_UARTMSG_RegRecvCbk
    Description:  注册用户回调函数
    Parameter:    用户实现的回调函数
    Return:       HI_SUCCESS 成功
                  HI_FAILURE 注册用户回调函数失败
********************************************************************/
HI_S32 HI_UARTMSG_RegRecvCbk(PFN_HI_UARTMSG_RECV_CBK pfnRecvMsgCbk);

/*********************************************************************
    Function:     HI_UARTMSG_UnregRecvCbk
    Description:  清楚户注册函数
    Parameter:    用户实现的回调函数
    Return:       HI_SUCCESS 成功
                  HI_FAILURE 取消用户注册函数失败/注册函数不存在
********************************************************************/
HI_S32 HI_UARTMSG_UnregRecvCbk(PFN_HI_UARTMSG_RECV_CBK pfnRecvMsgCbk);

/*********************************************************************
    Function:     HI_UARTMSG_Init
    Description:  初始化uart管脚复用,启动uart接收处理线程
    Parameter:
    Return:       HI_SUCCESS 成功
                  HI_FAILURE uart初始化失败
********************************************************************/
HI_S32 HI_UARTMSG_Init(HI_VOID);

/*********************************************************************
    Function:     HI_UARTMSG_Deinit
    Description:  uart去初始化
    Parameter:
    Return:       HI_SUCCESS 成功
                  HI_FAILURE 去初始化设备失败
********************************************************************/
HI_S32 HI_UARTMSG_Deinit(HI_VOID);

/*********************************************************************
    Function:     发送消息，
    Description:  根据传入参数，组成一帧信息发送给MCU
    Parameter:    msgId:  消息ID
                  data:   消息包含的数据起始地址
                  dataLen:消息包含的数据长度
    Return:       HI_SUCCESS 成功
                  HI_FAILURE 消息发送失败
********************************************************************/
HI_S32 HI_UARTMSG_SendData(HI_UARTMSG_MSGID_E msgId, HI_U8* data, HI_U16 dataLen);

/*********************************************************************
    Function:     发送消息，注发送前pSendMsg，消息内容必须memset
    Description:  uart用户讯息发送接口
    Parameter:    pSendMsg : 将要发送的消息
    Return:       HI_SUCCESS 成功
                  HI_FAILURE 消息发送失败
********************************************************************/
HI_S32 HI_UARTMSG_SendMsg(HI_UARTMSG_PARM_S*  pSendMsg);

/*********************************************************************
    Function:     HI_UARTMSG_SendMsgAndWaitMsg
    Description:  向MCU发送消息，同时等待MCU回复pWaitMsg消息
    Parameter:    pSendMsg : 将要发送的消息
                  pWaitMsg   : 等待MCU回复的消息
    Return:       HI_SUCCESS 成功
                  HI_FAILURE 消息发送失败
********************************************************************/
HI_S32 HI_UARTMSG_SendMsgAndWaitMsg(HI_UARTMSG_PARM_S*  pSendMsg,
                                                    HI_UARTMSG_PARM_S* pWaitMsg,
                                                    HI_U32 timeoutMs);

/*********************************************************************
    Function:     HI_UARTMSG_DebugSwitch
    Description:  控制Debug开关
    Parameter:    s32Switch : 1:开  0:关
********************************************************************/
HI_VOID HI_UARTMSG_DebugSwitch(HI_S32 s32Switch);

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */

#endif /* __HI_UARTMSG_H__ */
